#pragma once

#include <packet_sql.h>
#include <tshark_condition.h>
#include <tshark_datatype.h>
#include <loguru.hpp>
#include <string>
#include <vector>
#include <sqlite3.h>
#include <memory>
#include <functional>

namespace Tshark
{
    /*
    note: 数据库的封装类（还可以改善，比如delete还没实现、sql语句还能改善等）
    */
    class TsharkDataBase
    {
    public:
        TsharkDataBase() = default;

        /// @brief 打开database
        /// @param dbName
        /// @return 打开成功返回true,失败返回false
        bool openDataBase(const std::string &dbName);

        /// @brief 将packets插入到db中
        /// @param packets
        /// @return 成功返回true，失败返回false
        bool storePackets(const std::vector<std::shared_ptr<DataType::Packet>> &packets);

        /// @brief 查询db中的数据，如果查询成功，将数据保存在packetList中
        /// @param packetList
        /// @return
        bool queryPackets(std::vector<std::shared_ptr<DataType::Packet>> &packetList);

        bool queryPackets(const std::string &ip, uint16_t port, std::vector<std::shared_ptr<DataType::Packet>> &packets);

        bool queryPackets(const QueryConditon& conditon,std::vector<std::shared_ptr<DataType::Packet>>& packets);
        
        ~TsharkDataBase();

    private:
        bool createPacketTable();

    private:
        std::unique_ptr<sqlite3, std::function<int(sqlite3 *)>> db{nullptr};
    };
}